#include <unistd.h>
#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;

/*
int main()
{
    // 建立管道
    int tmp[2] = {0};
    int n = pipe(tmp);  
    if (n == -1)
    {
        cout << "管道建立失败" << endl;
        exit(-1);
    }

    // 创建子进程，父子进程指向同一个文件
    int id = fork();
    if (id < 0)
    {
        cout << "进程创建失败" << endl;
        exit(-1);
    }

    // father-w
    if (id > 1)
    {
        close(tmp[0]); // 关闭读文件
        char str[1024];

        snprintf(str, sizeof(str) - 1, "i am father"); // 防止str被写穿，预留\0
        write(tmp[1], str, strlen(str));               // 写入到文件中（文件中是不存在\0的）

        pid_t rid = waitpid(id, nullptr, WNOHANG); // 等待子进程退出
        if (rid == id)
        {
            cout << "wait ok" << endl;
        }
    }

    // child-r
    if (id == 0)
    {
        close(tmp[1]); // 关闭写文件
        char buffer[1024];

        int sz = read(tmp[0], buffer, sizeof(buffer) - 1); // 防止读入buffer的数据超出临时空间，预留\0
        // 正常情况sz=0的时候，是因为管道没数据，写端口阻塞
        if (sz > 0)
        {
            buffer[sz] = 0; // 字符串末尾加0
            cout << buffer << endl;
        }
    }

    return 0;
}
*/
/*
int main()
{
    //打开文件
    int fd = open("pipe",O_WRONLY|O_TRUNC);
 
    //写信息
    string tmp="i am process A";

    write(fd,tmp.c_str(),tmp.size());
    
    close(fd);
 
    return 0;
}
*/

// void sigcb(int signo)
// {
//     cout << "进程收到了" << signo << "信号" << endl;
//     exit(1);
// }
// void handler(int signo)
// {
//     sigcb(signo);
// }
// int main()
// {
//     signal(2, handler); // 自定义捕捉2号信号
//     while (1)
//     {
//         cout << "死循环" << endl;
//         sleep(1);
//     }
 
//     return 0;
// }

// void handler(int signo)
// {
//     cout<<" recieve a signal: "<<signo<<endl;
// }
// int main()
// {
 
//     struct sigaction act,oact;
//     act.sa_handler=handler;
//     sigaction(2,&act,&oact);
//     while(1);
 
//     return 0;
// }

//sigprocmask信号屏蔽
 
void handler(int signo)
{
    cout<<"当前收到"<<signo<<"号信号"<<endl;
}
int main()
{
    cout<<"mypid = "<<getpid()<<endl;
    sigset_t set,oset;//创建临时位图block表
    signal(2,handler);//自定义二号信号的方法
 
    //清空临时信号集
    sigemptyset(&set);
    sigemptyset(&oset);
 
    //设置信号集到临时变量
    sigaddset(&set,2);
    sigaddset(&set,40);
 
    sigprocmask(SIG_SETMASK,&set,&oset);//将信号集设置到该进程中
 
    while(1)
    {}
 
    return 0;
}